package com.the.ui.widge.photoview

import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.GestureDetector
import android.view.MotionEvent

//  ┏┓　　　┏┓
//┏┛┻━━━┛┻┓
//┃　　　　　　　┃
//┃　　　━　　　┃
//┃　┳┛　┗┳　┃
//┃　　　　　　　┃
//┃　　　┻　　　┃
//┃　　　　　　　┃
//┗━┓　　　┏━┛
//    ┃　　　┃                  神兽保佑
//    ┃　　　┃                  永无BUG！
//    ┃　　　┗━━━┓
//    ┃　　　　　　　┣┓
//    ┃　　　　　　　┏┛
//    ┗┓┓┏━┳┓┏┛
//      ┃┫┫　┃┫┫
//      ┗┻┛　┗┻┛
/**
 * @author The one
 * @date 2021-11-03 16:56
 * @describe 双击放大
 * @email 625805189@qq.com
 * @remark
 */
open class PhotoView3
@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : PhotoView2(context, attrs, defStyleAttr, defStyleRes) {

    /**
     * 是否为放大状态
     */
    open var isEnlarge: Boolean = false

    /**
     * 加上动画慢慢的变大变小
     */
    protected val scaleAnimator: ObjectAnimator by lazy {
        // TODO 会通过反射找到  propertyName = "currentScale" 这个属性的 setCurrentScale 方法不断地去设置值
        //      在PhotoView1中已处理
        ObjectAnimator.ofFloat(this, "currentScale", 0f)
    }

    /**
     * 手势操作
     */
    private val gestureDetector: GestureDetector by lazy {
        GestureDetector(context, PhotoGestureListener())
    }

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return gestureDetector.onTouchEvent(event)
    }

    open fun getAnimator():ObjectAnimator{
       return scaleAnimator.apply {
            setFloatValues(smallScale, bigScale)
        }
    }

    protected open fun startAnimator(){
        getAnimator().start()
    }
    protected open fun reverseAnimator(){
        getAnimator().reverse()
    }

    protected open fun computeOffset(e: MotionEvent){}
    protected open fun onScroll(distanceX: Float,distanceY:Float){}
    protected open fun onFling(velocityX: Float,velocityY:Float){}

    inner class PhotoGestureListener: GestureDetector.SimpleOnGestureListener() {

        // 拦截事件
        override fun onDown(e: MotionEvent?): Boolean  = true

        // 双击
        override fun onDoubleTap(e: MotionEvent?): Boolean {
            e?.let {
                isEnlarge = !isEnlarge
                if (isEnlarge) {
                    computeOffset(it)
                    startAnimator()
                } else {
                    reverseAnimator()
                }
            }
            return super.onDoubleTap(e)
        }

        override fun onScroll(
            e1: MotionEvent?,
            e2: MotionEvent?,
            distanceX: Float,
            distanceY: Float
        ): Boolean {
            onScroll(distanceX,distanceY)
            return super.onScroll(e1, e2, distanceX, distanceY)
        }

        override fun onFling(
            e1: MotionEvent?,
            e2: MotionEvent?,
            velocityX: Float,
            velocityY: Float
        ): Boolean {
            onFling(velocityX,velocityY)
            return super.onFling(e1, e2, velocityX, velocityY)
        }



    }

}